/**
 * Fit terminal columns and rows to the dimensions of its DOM element.
 *
 * ## Approach
 * - Rows: Truncate the division of the terminal parent element height by the terminal row height.
 *
 * - Columns: Truncate the division of the terminal parent element width by the terminal character
 * width (apply display: inline at the terminal row and truncate its width with the current
 * number of columns).
 * @module xterm/addons/fit/fit
 * @license MIT
 */

(function(fit) {
    if (typeof exports === 'object' && typeof module === 'object') {
        /*
         * CommonJS environment
         */
        module.exports = fit(require('../../xterm'));
    } else if (typeof define == 'function') {
        /*
         * Require.js is available
         */
        define(['../../xterm'], fit);
    } else {
        /*
         * Plain browser environment
         */
        fit(window.Terminal);
    }
})(function(Xterm) {
    var exports = {};

    exports.proposeGeometry = function(term) {
        if (!term.element.parentElement) {
            return null;
        }
        var parentElementStyle = window.getComputedStyle(term.element.parentElement),
            parentElementHeight = parseInt(parentElementStyle.getPropertyValue('height')),
            parentElementWidth = Math.max(0, parseInt(parentElementStyle.getPropertyValue('width')) - 17),
            elementStyle = window.getComputedStyle(term.element),
            elementPaddingVer = parseInt(elementStyle.getPropertyValue('padding-top')) + parseInt(elementStyle.getPropertyValue('padding-bottom')),
            elementPaddingHor = parseInt(elementStyle.getPropertyValue('padding-right')) + parseInt(elementStyle.getPropertyValue('padding-left')),
            availableHeight = parentElementHeight - elementPaddingVer,
            availableWidth = parentElementWidth - elementPaddingHor,
            container = term.rowContainer,
            subjectRow = term.rowContainer.firstElementChild,
            contentBuffer = subjectRow.innerHTML,
            characterHeight,
            rows,
            characterWidth,
            cols,
            geometry;

        subjectRow.style.display = 'inline';
        subjectRow.innerHTML = 'W'; // Common character for measuring width, although on monospace
        characterWidth = subjectRow.getBoundingClientRect().width;
        subjectRow.style.display = ''; // Revert style before calculating height, since they differ.
        characterHeight = subjectRow.getBoundingClientRect().height;
        subjectRow.innerHTML = contentBuffer;

        rows = parseInt(availableHeight / characterHeight);
        cols = parseInt(availableWidth / characterWidth);

        geometry = { cols: cols, rows: rows };
        return geometry;
    };

    exports.fit = function(term) {
        var geometry = exports.proposeGeometry(term);

        if (geometry) {
            term.resize(geometry.cols, geometry.rows);
        }
    };

    Xterm.prototype.proposeGeometry = function() {
        return exports.proposeGeometry(this);
    };

    Xterm.prototype.fit = function() {
        return exports.fit(this);
    };

    return exports;
});